libraries
library(ggplot2)
library(ggthemes)
library(gridExtra)
library(knitr)
library(htmlTable)
library(readr)
library(sp)
library(rgeos)
library(tmap)
library(tmaptools)
library(sf)
library(rgdal)
library(geojsonio)
library(spData)
library(tidyverse)
library(maptools)
library(RColorBrewer)
library(plyr)
#install.packages("reshape")
library(reshape)
library(classInt)
#install.packages("BAMMtools")
library(BAMMtools)
Identify locations outside the Industrial Land Designation areas with high concentration of manufacturing, other economic activities and residences.
We have analysed 3 open data datasets refering to Manufacturing in London.
URLs:
1 https://data.london.gov.uk
2 https://www.nomisweb.co.uk/
3 https://www.ons.gov.uk/employmentandlabourmarket/peopleinwork/employmentandemployeetypes/bulletins/businessregisterandemploymentsurveybresprovisionalresults/provisionalresults2017revisedresults2016#quality-and-methodology
4 https://www.ons.gov.uk/aboutus/whatwedo/paidservices/interdepartmentalbusinessregisteridbr https://www.ons.gov.uk/businessindustryandtrade/business/activitysizeandlocation/methodologies/ukbusinessactivitysizeandlocationqmi
A detailed analysis was carried out for the BRES dataset due to four reasons:
The number of manufacturing jobs obtained from the BRES dataset is considered the best proxy to represent manufacturing intensity. This measure can be interpreted as a combination of number of manufacturing units and size.
The level of detail of the BRES dataset at the LSOA area is considered sufficient to allow the selection of case study areas for micro-morphology analysis.
The SIC dataset despite having a finer-grain resolution has shown innacuracies in the location of the data points (reference: Vyner street case study Cites of Making project).
Despite the fact that the IDBR considers a larger sample at the national level, it is aggregated at a lower resolution geographic area (MSOA). Also, because according to a data methodological note “it is possible to get multiple business registrations at a single address and this can distort data for smaller geographical areas” (https://www.ons.gov.uk/businessindustryandtrade/business/activitysizeandlocation/methodologies/ukbusinessactivitysizeandlocationqmi/pdf).
Data source: NOMIS official labour market statistics (ONS) URL: https://www.nomisweb.co.uk/
Definition: “An employer survey of the number of jobs held by employees broken down by full/part-time and detailed industry (5 digit SIC2007). The survey records a job at the location of an employees workplace. Available from country down to lower level super output area and Scottish datazone.”
Ref URLs: https://onsdigital.github.io/dp-classification-tools/standard-industrial-classification/ONS_SIC_hierarchy_view.html
Read NOMIS data. Lower Layer Super Output Area (2011)
Industry Standard industrial classification of economic activities (SIC) 2007 section C: Manufacturing
nom <- read_csv("/Volumes/ritd-ag-project-rd00lq-jamfe87/GIS_Analysis/dataProcessed/nomis_4835.csv") # 4,835 obs.
Create variable ‘lsoa11_cd’ from variable ‘lsoa11_2011’ substract chr 1 to 4 (first 4 characters)
nom <- mutate(nom, lsoa11_cd = substr(lsoa_2011, 1, 9))
Summary of ‘nom’ Count and Industry percentage
summary(nom)
nrow(table(nom$Count)) # [1] 34
dCount <-as.data.frame(table(nom$Count))
colnames(dCount) <-c("Jobs", "Frequency")
dCount1 <- cbind(dCount[1:10, ], dCount[11:20, ], dCount[21:30, ], dCount[31:40, ])
htmlTable(dCount1, rnames=F, caption="Jobs count frequency per LSOA (N = 4,835)", col.columns = c("none", "#F7F7F7"), css.cell="padding-left:1em; padding-right:1em;")
Most LSOAs have 0 jobs in manufacturing. Among the rest the most frequent number is 10 jobs (in 539 LSOAs). High number of jobs ( > 1500) are an exception.
table(nom[,3]) # 22 LSOA with 20% jobs in Manufacturing Industry
nrow(table(nom$`Industry percentage`)) # [1] 107
dInd <-as.data.frame(table(nom$`Industry percentage`))
colnames(dInd) <-c("Perc.", "Frequency")
dInd1 <- cbind(dInd[1:22, ], dInd[23:44, ], dInd[45:66, ], dInd[67:88, ], dInd[89:110, ])
htmlTable(dInd1, rnames=F, caption="Jobs Percentage frequency per LSOA (N = 4,835)", col.columns = c("none", "#F7F7F7"), css.cell="padding-left:1em; padding-right:1em;")
Most LSOAs have 0% jobs in manufacturing. Among the rest the most frequent percentage is 5% (in 102 LSOAs). High percentage of jobs ( > 53%) are an exception.
# drop 0 values
nom1 <- subset(nom, nom$Count > 0 & nom$`Industry percentage` > 0) # 1730
Summary of values > 0
summary(nom1)
# style
th <- theme_tufte(base_family = "Georgia")
h1 <- ggplot(nom1, aes(Count)) + geom_histogram(bins = 6000/5, fill="magenta") + th + ylab("LSOAs") + xlab("Jobs count")
h2 <- ggplot(nom1, aes(Count)) + geom_histogram(bins = 150/5, fill="magenta") + th + xlim(c(0, 150)) + ylab("LSOAs") + xlab("Jobs count (0-150)")
h3 <- ggplot(nom1, aes(`Industry percentage`)) + geom_histogram(bins = 100, fill="magenta") + th + ylab("LSOAs") + xlab("% of jobs in Manufacturing")
h4 <- ggplot(nom1, aes(`Industry percentage`)) + geom_histogram(bins = 200, fill="magenta") + th + xlim(c(0, 35)) + ylab("LSOAs") + xlab("% of jobs in Manufacturing (0-35%)")
grid.arrange(h1, h2, h3, h4, nrow=2)
fnC <- fivenum(nom1$Count)
fnP <- fivenum(nom1$`Industry percentage`)
anC <- annotate(geom="text", label=round(fnC ,digits=2), x= 1, y=fnC, size = 3, family = "Georgia", hjust =-.2)
anP <- annotate(geom="text", label=round(fnP ,digits=2), x= 1, y=fnP, size = 3, family = "Georgia", hjust =-.2)
th <- theme(axis.title=element_blank(),axis.ticks.x = element_blank(), axis.text.x=element_blank())
bC <- ggplot(nom1, aes(1, Count)) + geom_tufteboxplot() + scale_y_log10() + theme_classic() + anC +
ggtitle("Jobs Count (N = 1,730)") + th + theme_tufte()
bP <- ggplot(nom1, aes(1, `Industry percentage`)) + geom_tufteboxplot() + scale_y_log10() + theme_classic() + anP + ggtitle("Jobs Percentage (N = 1,730)") + th + theme_tufte()
grid.arrange(bC, bP, nrow=1)
lsoa <- st_read("/Volumes/ritd-ag-project-rd00lq-jamfe87/GIS_Analysis/dataRaw/statistical-gis-boundaries-london/ESRI/LSOA_2011_London_gen_MHW.shp")
Create gray London basemap
Join with NOMIS data ‘nom’
mpl <- append_data(lsoa, nom, key.shp = "LSOA11CD", key.data = "lsoa11_cd", ignore.duplicates = TRUE, ignore.na = TRUE)
names(mpl)
Maps of job Counts > 40 and Percentage > 6% (> 3rd Q)
# change column name
colnames(mpl)[17] <- "IndPer"
c40 <- subset(mpl, Count >= 40) # 439 obs.
p6 <- subset(mpl, IndPer >= 6) # 434 obs.
# CP <- subset(mpl, Count >= 40 | IndPer >= 6)
mc40 <- tm_shape(gLonC) +
tm_fill(col = "gray95") +
tm_shape(c40) +
tm_polygons("Count",
style="jenks",
palette="PuRd",
title= "Count",
border.col="white",
border.alpha = 0.1,
legend.hist = T) +
tm_layout(inner.margins = c(0, 0.1, 0.05, 0.2), frame = F,
legend.outside = T, legend.outside.position = "bottom", legend.stack = "horizontal", legend.hist.width = 3, legend.hist.height = 0.8) +
tm_legend(main.title = "Jobs Count > 3rd Q (N=439 obs.)",
main.title.position = "left",
main.title.size=0.9)
mc40
mp6 <- tm_shape(gLonC) +
tm_fill(col = "gray95") +
tm_shape(p6) +
tm_polygons("IndPer",
style="jenks",
palette="BuPu",
title= "Percentage",
border.col="white",
border.alpha = 0.1,
legend.hist = T) +
tm_layout(inner.margins = c(0, 0.1, 0.05, 0.2), frame = F,
legend.outside = T, legend.outside.position = "bottom", legend.stack = "horizontal", legend.hist.width = 3, legend.hist.height = 0.8) +
tm_legend(main.title = "Jobs Percentage > 3rd Q (N=434 obs.)",
main.title.position = "left",
main.title.size=0.9)
mp6
tmap_arrange(mc40 ,mp6 , nrow=1)
A visual comparison shows that LSOAs with high number of jobs in some cases is coincident with LSOAs with high percentage of jobs. Both meaures might be indicators of ‘manufacturing intensity’.
msum <- tm_shape(mpl) +
tm_polygons(col="#ffffe5", border.col="#ededed", border.alpha = 0.01) +
tm_shape(c40) +
tm_polygons("Count",
style="jenks",
palette="BuPu",
title="Jobs Count",
border.col="white",
border.alpha = 0.1,
alpha = 0.5) +
tm_shape(p6) +
tm_polygons(border.col = "magenta",
border.alpha = 0.5,
alpha = 0,
popup.vars= c("Count" ,"IndPer")) +
tm_layout(inner.margins = c(0, 0.1, 0.05, 0.2), frame = F)
tmap_mode("plot")
tmap mode set to plotting
msum
Interactive Map
msum.i <- msum
tmap_mode("view")
tmap mode set to interactive viewing
msum.i